#ifndef AMANSTA_H_       //20200303 bai 从Control_Station_Linux更新到Control_Station_Win
#define AMANSTA_H_
#include "../../SAMA_Function.h"
/////////*模块运算中间参数结构体定义*/
enum Track_Sta
{
	NO_TR,
	Yes_TR
};

//< 是否允许手动枚举  bai shi 20200913 新增
enum AM_ALLOW
{
	MAN_ALLOW,//< 允许手动
	AUTO_ONLY//< 只能自动
};

////< 手自动状态枚举
enum AM_Sta
{
	AUTO,//< 自动
	MAN//< 手动

};

enum Force_MRE
{
	NO_Force_MAN,
	Yes_Force_MAN
};

enum Force_MRA
{
	NO_Force_AUTO,
	Yes_Force_AUTO

};

enum Work_Mode
{
	Normal,				////< 正常模式
	Electric			////< Electric模式 
};

enum Electric_Mode
{
	Long_Signal,		////< 长信号
	Pulse				////< 脉冲
};

/////*模块可调参数结构体*/
typedef struct {
	float K;					////< 输出增益
	float Bias;					////< 输出偏置
	float Y_High;				////< Y输出上限
	float Y_Low;				////< Y输出下限
	float SP_High;				////< SP输出上限
	float SP_Low;				////< SP输出下限
	float Trate;				////< 变化率
	float DeadBand;				////< 死区
	float OnTime;				////< 高电平宽度
	float OffTime;				////< 低电平宽度
	bool TurnOver;				////< 输出反向or输出正向
	AM_Sta FP;					////< 初始化方式（0：手动 1：自动）
	AM_Sta ManF;				////< 手动禁止 (0:允许手动 1：禁止手动)
	Work_Mode Mode;				////< 工作方式 (0:Normal;1:Electric)
	Electric_Mode EMode;		////< Electric输出方式(0:长信号;1:脉冲)
}AManSta_Par_t;


/////*模块运算中间参数结构体定义*/
typedef struct {
	float ManOut;
	float SP_ManOut;
	AM_Sta MA_Sta;
	int Y_Press;
	float Y_PressTime;
	float Y_Rate;
	int SP_Press;
	float SP_PressTime;
	float SP_Rate;

	float INCCounte;
	float DECCounte;
	bool Last_MRA;				////< 上一时刻强制自动状态
	float Last_Y_Value;

	int Init_Count;				////< 初始化标志
}AManSta_Sta_t;


/////*模块参数结构体定义*/
struct AManSta_T
{
	Model_Base_t Base;			////< 模块基本参数结构体
	AManSta_Par_t Par;			////< 模块可调参数结构体
	AManSta_Sta_t Sta;			////< 模块运算中间参数结构体
};

extern AManSta_T* AManSta_t;

/////*函数*/
bool CALCU_SAMA(AManSta)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);		////< SAMA运算函数
int BC_PARA(AManSta)(Model_Base_t* arg, void** Data);													////< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(AManSta)(Model_Base_t* arg, void** Data);													////< 备份SAMA运算中间参数
int ANA_STA(AManSta)(Model_Base_t* arg, void** Data);													////< 解析备份的SAMA运算中间参数
int CHANGE_PAR(AManSta)(Model_Base_t* arg, void** Data);												////< 在线修改模块参数函数
void INIT_STAPAR(AManSta)(Model_Base_t* arg);															////< 初始化模块运算中间参数
void CMD_DEAL(AManSta)(Model_Base_t* arg, void* Data, const char* CMD);

#endif
